package pwd.allen.aop.advice;

import org.springframework.aop.ThrowsAdvice;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 异常通知：方法调用抛出异常时执行、无法控制程序执行，只能修改抛出的异常类型
 * Spring允许异常通知定义应该捕获哪些异常类型，原理是通过反射来检测方法签名，方法名必需是afterThrowing，否则无法识别
 *
 *
 * @author 门那粒沙
 * @create 2020-08-30 12:25
 **/
public class MyThrowsAdvice implements ThrowsAdvice {

    /**
     * 方法返回类型并不重要，但是最好是void
     * @param ex
     * @throws Throwable
     */
    public void afterThrowing(Exception ex) throws Throwable {
        System.out.println(String.format("【ThrowsAdvice】throw error = %s", ex.toString()));
    }

    /**
     * 指定捕捉ArithmeticException异常，其他异常会走上面那个方法
     * 如果需要获取其他参数，必须按照顺序指定全部四个参数，否则无法识别到
     * @param method
     * @param args
     * @param target
     * @param ex
     * @throws Throwable
     */
    public void afterThrowing(Method method, Object[] args, Object target, ArithmeticException ex) throws Throwable {
        System.out.println(String.format("【ThrowsAdvice】throws '%s',args = %s,error = %s", method.getName(), Arrays.toString(args), ex.toString()));
    }
}
